package com.zenithmind.chat.controller.base;

import com.zenithmind.common.context.UserContext;
import com.zenithmind.common.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

/**
 * 基础控制器类 - 遵循DRY原则
 * 提供通用的方法和工具，避免代码重复
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Slf4j
public abstract class BaseController {

    /**
     * 获取当前用户ID
     * 
     * @return 用户ID
     */
    protected String getCurrentUserId() {
        String userId = UserContext.getUserId();
        if (!StringUtils.hasText(userId)) {
            throw new IllegalStateException("用户未登录");
        }
        return userId;
    }

    /**
     * 获取当前用户名
     * 
     * @return 用户名
     */
    protected String getCurrentUsername() {
        String username = UserContext.getUsername();
        if (!StringUtils.hasText(username)) {
            return "未知用户";
        }
        return username;
    }

    /**
     * 创建成功响应
     * 
     * @param data 响应数据
     * @param <T> 数据类型
     * @return 成功响应
     */
    protected <T> Result<T> success(T data) {
        return Result.success(data);
    }

    /**
     * 创建成功响应（无数据）
     * 
     * @return 成功响应
     */
    protected Result<Void> success() {
        return Result.success();
    }

    /**
     * 创建失败响应
     * 
     * @param message 错误消息
     * @return 失败响应
     */
    protected Result<Void> error(String message) {
        return Result.fail(message);
    }

    /**
     * 验证参数不为空
     * 
     * @param value 参数值
     * @param paramName 参数名称
     */
    protected void validateNotEmpty(String value, String paramName) {
        if (!StringUtils.hasText(value)) {
            throw new IllegalArgumentException(paramName + "不能为空");
        }
    }

    /**
     * 验证参数不为null
     * 
     * @param value 参数值
     * @param paramName 参数名称
     */
    protected void validateNotNull(Object value, String paramName) {
        if (value == null) {
            throw new IllegalArgumentException(paramName + "不能为null");
        }
    }

    /**
     * 验证分页参数
     * 
     * @param pageNum 页码
     * @param pageSize 页大小
     */
    protected void validatePageParams(Integer pageNum, Integer pageSize) {
        if (pageNum == null || pageNum < 1) {
            throw new IllegalArgumentException("页码必须大于0");
        }
        if (pageSize == null || pageSize < 1 || pageSize > 100) {
            throw new IllegalArgumentException("页大小必须在1-100之间");
        }
    }

    /**
     * 记录操作日志
     * 
     * @param operation 操作名称
     * @param target 操作目标
     * @param result 操作结果
     */
    protected void logOperation(String operation, String target, boolean result) {
        String userId = getCurrentUserId();
        if (result) {
            log.info("用户[{}]执行操作[{}]成功，目标：{}", userId, operation, target);
        } else {
            log.warn("用户[{}]执行操作[{}]失败，目标：{}", userId, operation, target);
        }
    }
}
